package com.siwei.eqi.util;

import com.siwei.eqi.pojo.entity.GuangdongLandUse;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 计算生境质量指数（HQI）
 */
public class HqiCalculatorUtil {

    // 归一化系数
    private static final BigDecimal A_BIO = new BigDecimal("494.8122");

    public static BigDecimal calculateHQI(GuangdongLandUse landUse) {
        // 1. 计算各分类指数
        BigDecimal sf = calculateSF(landUse);    // 林地指数
        BigDecimal sg = calculateSG(landUse);    // 草地指数
        BigDecimal sw = calculateSW(landUse);    // 水域湿地指数
        BigDecimal sc = calculateSC(landUse);    // 耕地指数
        BigDecimal sb = calculateSB(landUse);    // 建设用地指数
        BigDecimal su = calculateSU(landUse);    // 未利用地指数

        // 2. 加权求和（公式中的括号部分）
        BigDecimal weightedSum = sf.multiply(new BigDecimal("0.35"))
                .add(sg.multiply(new BigDecimal("0.21")))
                .add(sw.multiply(new BigDecimal("0.28")))
                .add(sc.multiply(new BigDecimal("0.11")))
                .add(sb.multiply(new BigDecimal("0.04")))
                .add(su.multiply(new BigDecimal("0.01")));

        // 3. 乘以归一化系数并除以区域面积
        BigDecimal hqi = A_BIO.multiply(weightedSum)
                .divide(landUse.getCountyArea(), 4, RoundingMode.HALF_UP);

        return hqi;
    }

    // 林地指数 = ∑(各林地类型面积 × 分权重)
    private static BigDecimal calculateSF(GuangdongLandUse landUse) {
        return landUse.getForestedLand().multiply(new BigDecimal("0.60"))      // 有林地 0.6
                .add(landUse.getShrubland().multiply(new BigDecimal("0.25")))  // 灌木林 0.25
                .add(landUse.getSparseForest().multiply(new BigDecimal("0.15"))) // 疏林地 0.15
                .add(landUse.getOtherWoodland().multiply(new BigDecimal("0.15"))); // 其他林地 0.15
    }

    // 草地指数 = ∑(各草地类型面积 × 分权重)
    private static BigDecimal calculateSG(GuangdongLandUse landUse) {
        return landUse.getHighCoverageGrassland().multiply(new BigDecimal("0.60"))  // 高覆盖 0.6
                .add(landUse.getMediumCoverageGrassland().multiply(new BigDecimal("0.30"))) // 中覆盖 0.3
                .add(landUse.getLowCoverageGrassland().multiply(new BigDecimal("0.10")));   // 低覆盖 0.1
    }

    // 水域湿地指数 = ∑(各水域类型面积 × 分权重)
    private static BigDecimal calculateSW(GuangdongLandUse landUse) {
        return landUse.getRiverArea().multiply(new BigDecimal("0.10"))          // 河流 0.1
                .add(landUse.getLakeArea().multiply(new BigDecimal("0.30")))    // 湖泊 0.3
                .add(landUse.getReservoirPondArea().multiply(new BigDecimal("0.30"))) // 水库坑塘 0.3
                .add(landUse.getTidalFlat().multiply(new BigDecimal("0.50")))   // 滩涂 0.5
                .add(landUse.getMarshland().multiply(new BigDecimal("0.50")))   // 沼泽地 0.5
                .add(landUse.getPermanentGlacierSnow().multiply(new BigDecimal("0.10"))); // 冰川雪地 0.1
    }

    // 耕地指数 = ∑(耕地类型面积 × 分权重)
    private static BigDecimal calculateSC(GuangdongLandUse landUse) {
        return landUse.getPaddyField().multiply(new BigDecimal("0.60"))     // 水田 0.6
                .add(landUse.getDryFarmland().multiply(new BigDecimal("0.40"))); // 旱地 0.4
    }

    // 建设用地指数 = ∑(建设用地面积 × 分权重)
    private static BigDecimal calculateSB(GuangdongLandUse landUse) {
        return landUse.getUrbanConstruction().multiply(new BigDecimal("0.30"))   // 城镇 0.3
                .add(landUse.getRuralResidential().multiply(new BigDecimal("0.40"))) // 农村 0.4
                .add(landUse.getOtherConstruction().multiply(new BigDecimal("0.30"))); // 其他 0.3
    }

    // 未利用地指数 = ∑(未利用地面积 × 分权重)
    private static BigDecimal calculateSU(GuangdongLandUse landUse) {
        return landUse.getSandyLand().multiply(new BigDecimal("0.20"))       // 沙地 0.2
                .add(landUse.getSalineAlkaliLand().multiply(new BigDecimal("0.30"))) // 盐碱地 0.3
                .add(landUse.getBareLand().multiply(new BigDecimal("0.20")))     // 裸土地 0.2
                .add(landUse.getBareRockGravel().multiply(new BigDecimal("0.30"))); // 裸岩 0.3
    }
}
